package com.xz.realdemo;

import com.xz.realdemo.factory.ChartFactory;
import com.xz.realdemo.factoryinterface.Chart;
import com.xz.realdemo.util.XMLUtil;

/**
 * @author 张志航     
 * @version V1.0.0
 * @projectName design_mode
 * @title     client   
 * @package    com.xz.realdemo  
 * @date   2019/11/24 17:29  
 * @explain
 */
public class Client {


    /**
     * 简单工厂模式案例:
     *  需求: 根据Java开发一套图表库,用以提供不同外观的图表;
     *      例如: 柱状图(HistogramChart)、饼状图（Piechart）、折线图（LinChart）等；
     *  需求分析：使用工厂模式开发一套灵活的可用的图表库，通过设置不同的参数可以获得不同的图表，使用简单工厂模式设计
     *      结构： 需要Chart抽象类(也可以是接口)作为抽象产品类，各种图库实现该接口通过不同的方式提供不同图表，工厂类用于生产这些图表，
     *             客户端通过传入不同的参数获取不同类型的图表
     *
     * @param args
     */
    public static void main(String[] args) {

        //testMethod1();

        /*
        由于Method1在想要修改图表类型时我们需要改客户端的代码，这违背了开闭原则，因此我们将类型提取到config.xml配置文件中,
        通过读取配置文件来获取需要创建的图表类型,这样在修改图表类型时我们只需要对配置文件进行修改即可(在Web项目中我们也可以通过前端传入该参数,
       在Spring框架中我们可以通过properties配置文件来实现)
         */
        //testMethod2();

        // 可以将简单工厂模式简化,将抽象产品类和工厂类合并
        testMethod3();
    }

    private static void testMethod3() {
        Chart chart;
        chart = Chart.getChart(XMLUtil.getChartType());
        chart.display();
    }

    private static void testMethod2() {
        Chart chart;
        chart = ChartFactory.getChart(XMLUtil.getChartType());
        chart.display();
    }

    private static void testMethod1() {
        Chart chart;
        chart = ChartFactory.getChart("line");
        chart.display();
    }

}
